/*
Date:20210428 22:12PM
key:0-n,每个i内部动态规划，用j遍历0-i，内部达成的条件是dp[j]为1 和 j-i为字串单词，一旦达成则 dp[i]为真。
*/
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) 
    {
    //很多字符串问题dp数组，无论一维二维，都要特判为0，因为空字符串也是字符串。
    vector<bool> dp(s.size()+1, false);
    //容器定义的时候就可以塞满，这里用unorderedset让查询到了O(N);
    unordered_set<string> m(wordDict.begin(), wordDict.end());
    dp[0] = true;
    for (int i = 1; i <= s.size(); ++i)
    {
        //对每一个dp[i]，都能否由一个dp[j]和一个j-i的单词组成(此处要遍历),一旦能则break.
        for (int j = 0; j < i; ++j){
            if (dp[j] && m.find(s.substr(j, i-j)) != m.end())
            {
                dp[i] = true;
                break;
            }
        }
    }
    return dp[s.size()];
}
};